import os
import traceback
from constants import HttpStatus
from datetime import datetime


def unified_response(code: int, msg: str, data: any = None, error: Exception = None):
    """
    统一响应格式函数
    
    该函数用于标准化所有API响应的格式，确保前端能够一致地处理返回数据。
    支持在调试模式下返回详细的错误信息，便于开发和调试。
    
    参数:
        code (int): HTTP状态码或业务状态码
        msg (str): 响应消息，通常是操作结果的描述
        data (any, optional): 响应数据，可以是任意类型的业务数据
        error (Exception, optional): 异常对象，用于在错误情况下提供详细信息
    
    返回:
        dict: 标准化的响应对象，包含code、msg、data字段，
              错误情况下还包含error_info和debug信息
    
    功能特点:
        - 统一的响应格式，便于前端统一处理
        - 支持调试模式，可返回详细的错误信息
        - 包含时间戳，便于问题追踪
        - 错误信息分级显示，生产环境只显示基本信息
    """
    response = {
        "code": code,
        "msg": msg,
        "data": data
    }
    
    # 如果在调试模式下且有错误信息，添加详细的错误信息
    if error is not None:
        debug_mode = os.getenv('DEBUG', 'False').lower() == 'true'
        return_internal_errors = os.getenv('DEBUG_RETURN_INTERNAL_ERRORS', 'False').lower() == 'true'
        
        # 始终包含基本错误信息
        response["error_info"] = {
            "error_type": type(error).__name__,
            "error_message": str(error)
        }
        
        # 如果在调试模式下，添加更详细的错误信息
        if debug_mode and return_internal_errors:
            response["debug"] = {
                "error_type": type(error).__name__,
                "error_message": str(error),
                "error_traceback": traceback.format_exc(),
                "error_class": error.__class__.__module__ + '.' + error.__class__.__name__,
                "error_args": getattr(error, 'args', []),
                "timestamp": datetime.now().isoformat()
            }
    
    return response

def get_error_response(error, context=None):
    """
    根据环境配置返回错误响应
    
    Args:
        error: 异常对象
        context: 可选的上下文信息
    
    Returns:
        dict: 格式化的错误响应
    """
    # 检查是否在调试模式下
    debug_mode = os.getenv('DEBUG', 'False').lower() == 'true'
    return_internal_errors = os.getenv('DEBUG_RETURN_INTERNAL_ERRORS', 'False').lower() == 'true'
    
    # 基础错误响应
    error_response = {
        "code": HttpStatus.INTERNAL_SERVER_ERROR,
        "msg": f"Internal server error: {str(error)}",  # 始终包含基本错误信息
        "data": None
    }
    
    # 如果在调试模式下且允许返回内部错误
    if debug_mode and return_internal_errors:
        error_response.update({
            "debug": {
                "error_type": type(error).__name__,
                "error_message": str(error),
                "error_traceback": traceback.format_exc(),
                "context": context or "No additional context",
                "error_class": error.__class__.__module__ + '.' + error.__class__.__name__,
                "error_args": getattr(error, 'args', []),
                "timestamp": datetime.now().isoformat()
            }
        })
    
    return error_response

def handle_database_error(error, operation="database operation"):
    """
    专门处理数据库错误的函数
    
    Args:
        error: 数据库异常对象
        operation: 操作描述
    
    Returns:
        dict: 格式化的错误响应
    """
    context = f"Failed during {operation}"
    return get_error_response(error, context)

def handle_validation_error(error_message, field=None):
    """
    处理验证错误的函数
    
    Args:
        error_message: 错误消息
        field: 出错的字段（可选）
    
    Returns:
        dict: 格式化的验证错误响应
    """
    error_data = {
        "code": HttpStatus.BAD_REQUEST,
        "msg": error_message,
        "data": None
    }
    
    if field:
        error_data["data"] = {"field": field}
    
    # 如果在调试模式下，添加更多详细信息
    debug_mode = os.getenv('DEBUG', 'False').lower() == 'true'
    if debug_mode:
        error_data["debug"] = {
            "validation_error": True,
            "field": field,
            "message": error_message
        }
    
    return error_data